package com.lzh.media.service.impl;

import com.alibaba.fastjson.JSON;
import com.lzh.common.constants.BusinessConstants;
import com.lzh.common.utils.RequestContextUtil;
import com.lzh.media.dto.ContentNode;
import com.lzh.media.dto.NewsDto;
import com.lzh.media.entity.WmNews;
import com.lzh.media.mapper.WmNewsMapper;
import com.lzh.media.service.WmNewsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 自媒体图文内容信息表 服务实现类
 * </p>
 *
 * @author lzh
 * @since 2021-06-24
 */
@Service
public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsService {

    @Resource
    private WmNewsMapper wmNewsMapper;
    @Autowired
    private KafkaTemplate kafkaTemplate;

    /**
     * 添加或修改文章
     * @param newsDto 添加或修改文章对象
     */
    @Override
    public void modify(NewsDto newsDto) {
        WmNews wmNews = new WmNews();
        //将添加的对象复制给WmNews
        BeanUtils.copyProperties(newsDto,wmNews);
        //文章内容处理，将List<ContentNode>转成字符串
        wmNews.setContent(JSON.toJSONString(newsDto.getContent()));
        // 封面图片类型处理 intValue()将Integer类型转换为int类型
        if (wmNews.getType().intValue() == 4) {
            //自动在文章内容中提取
            wmNews.setImages(convert(matchImage(newsDto.getContent())));
        } else {
            //自定义封面，单图，多图或无图
            wmNews.setImages(convert(newsDto.getImages()));
        }

        wmNews.setCreatedTime(LocalDateTime.now());
        //令牌解析获取想要的数据
        Object user_id = RequestContextUtil.getToken("token", "id");
        wmNews.setUserId(Integer.parseInt(user_id.toString()));
        //根据状态设置文章提交时间
        if (wmNews.getStatus().intValue() == 1) {
            wmNews.setSubmitedTime(LocalDateTime.now());
        }
        int res;
        //根据NewsDto对象判断是添加还是修改
        if (StringUtils.isEmpty(newsDto.getId())) {
            res = wmNewsMapper.insert(wmNews);
        }else {
            res  = wmNewsMapper.updateById(wmNews);
        }
        // 将消息发布到kafka中
//        if (res > 0 && wmNews.getStatus().intValue() == 1) {
//            kafkaTemplate.send(BusinessConstants.MqConstants.WM_NEWS_AUTO_SCAN_TOPIC,JSON.toJSONString(wmNews.getId()));
//        }
    }

    /**
     * 根据id查询文章，封装在dto中返回
     * @param id
     * @return
     */
    public NewsDto one(Integer id) {
        WmNews wmNews = wmNewsMapper.selectById(id);
        NewsDto newsDto = new NewsDto();
        BeanUtils.copyProperties(wmNews,newsDto);
        //将图片转换为list集合
        List<String> images = Arrays.asList(wmNews.getImages().split(","));
        //将 字符串直接转换为对象
        List<ContentNode> list = JSON.parseArray(wmNews.getContent(), ContentNode.class);
        newsDto.setContent(list);
        newsDto.setImages(images);
        return newsDto;
    }

    /**
     *  从文章内容中提取图片
     * @param nodes 文章内容对象
     * @return
     */
    public static List<String> matchImage(List<ContentNode> nodes) {
        List<String> images = new ArrayList<>();
        //遍历文章内容集合
        for (ContentNode node: nodes) {
            //判断是否存在image键,如果有将它添加到images集合
            if (node.getType().equals("image")) {
                images.add(node.getValue());
                //最多提取三张图片，超过三张停止循环
                if (images.size() > 3) {
                    break;
                }
            }
        }
        return images;
    }

    /**
     * 图片转换
     * @param images
     * @return
     */
    public static String convert(List<String> images) {
        if (images != null && images.size() > 0) {
            return images.toString().replace("[","").replace("]","").replace(" ","");
        }
        return null;
    }
}
